简单工厂

  1. public class OperationFactory{
  2. public static Operation createOperate(String operate){
  3. Operation oper=null;
  4. switch(operate){
  5. case "+":
  6. oper=new OperationAdd();
  7. break;
  8. case "-":
  9. oper=new OperationSub();
  10. break;
  11. case "*":
  12. oper=new OperationMul();
  13. break;
  14. case "/":
  15. oper=new OperationDiv();
  16. break;
  17. }
  18. return oper;
  19. }
  20. }

根据传参来确定 new的对象,但是如果要增加“工厂”生产的产品种类(new新种类的对象),还是要修改工厂类的代码(switch分支)。工厂方法可以解决这个问题。

工厂方法

  1. //工厂类接口
  2. interface IFactory{
  3. public Operation CreateOperation();
  4. }
  5. //具体工厂的实现类
  6. class AddFactory:IFactory{
  7. public Operation CreateOperation(){
  8. return new OperationAdd();
  9. }
  10. }
  11. class SubFactory:IFactory{
  12. public Operation CreateOperation(){
  13. return new OperationSub();
  14. }
  15. }
  16. .......

遵守了开闭原则,如果要增加新的“产品”,只需要新建对应的工厂类(实现工厂接口)和产品类(实现产品接口)即可。

抽象工厂

工厂方法中工厂接口有多个方法时就是抽象工厂。

建造者模式

  1. class Product{
  2. IList<String> parts=new List<String>();
  3. public void Add(String part){
  4. parts.Add(part);
  5. }
  6. }
  7. class Builder{
  8. public void BuildPartA();
  9. public void BuildPartB();
  10. public Product GetResult();
  11. }
  12. class ConcreteBuilder1:Builder{
  13. private Product product=new Product();
  14. @Override
  15. public void BuildPartA(){
  16. product.Add("partA");
  17. }
  18. @Override
  19. public void BuildPartB(){
  20. product.Add("partB");
  21. }
  22. @Override
  23. public Product GetResult(){
  24. return product;
  25. }
  26. }
  27. //Builder的另一种实现
  28. class ConcreteBuilder2:Builder{
  29. ........
  30. }
  31. class Director{
  32. public void Construct(Builder builder){
  33. builder.BuildPartA();
  34. builder.BuildPartB();
  35. }
  36. }

原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
参考:https://www.yuque.com/docs/share/b0f70f34-1a7e-41bb-9222-c46382a65bb3?# 《浅拷贝和深拷贝》

单例模式

保证一个类只有一个实例,并提供一个访问它的全局访问点。
参考:https://www.yuque.com/docs/share/c5bfe116-8ea2-4d35-9d34-9bdb09cece59?# 《单例的七种写法》