面向对象程序设计的优点和思想:
- 可维护
- 可扩展
- 可复用
- 灵活性好
面向对象程序设计的原则:
- 通过封装、继承和多态把程序的耦合度降低。类内耦合过紧不利于维护。使用设计模式是的程序更加灵活,容易修改,且易于复用。
- 用尽可能的方法去避免重复
工厂模式
一、含义特点
工厂模式专门负责将大量有共同接口的类实例化。工厂可以动态的决定将哪一个类实例化,不必事先知道每次要被实例化哪个类。
工厂模式的形态:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
二、简单工厂模式
1.定义
简单工厂模式根据提供的数据,的一个类的实例返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。
- 工厂类角色Creator:工厂类在客户端的直接控制下(create方法)创建产品对象。
- 抽象产品角色Product:定义简单工厂闯进的对象的父类或他们共同拥有的接口。可以是一个类、抽象类或接口。
- 具体产品角色ConcreteProduct:定义工厂具体加工出的对象。
接口:是用来封装隔离具体实现的,目的是不让客户端知道封装体内部的具体实现。简单工厂的位置是位于封装体内的,所以简单工厂知道具体类的实现是没有关系的。
对于客户端来说,只是知道了接口和简单工厂。
2.优缺点
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点:
- 当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
- 同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
- 简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。
本质
选择实现
编程是一门技术,更是一门艺术。
3.应用场景
- 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,则可以选用简单工厂。让客户端通过工厂来获取相应的接口,而无需关心具体的实现。
- 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂。
实例
【问题】实现动物叫声类
【代码】
public interface IShout {
abstract public String shout();
}
public interface IChange {
abstract public String change(String thing);
}
public interface IDoShout {
abstract public String doShout();
}
abstract public class Animals implements IShout, IDoShout {
protected String name = "";
protected int shoutNum = 3;
public Animals(String name, int shoutNum) {
super();
this.name = name;
this.shoutNum = shoutNum;
}
@Override
public String doShout() {
String result = "";
for (int i = 0; i < shoutNum; i++)
result += shout() + ",";
return "我的名字叫" + name + " " + result;
}
@Override
public String shout() {
return "";
}
}
public class Dog extends Animals {
public Dog(String name, int shoutNum) {
super(name, shoutNum);
// TODO Auto-generated constructor stub
}
public String shout() {
return "汪";
}
public String doShout() {
return super.doShout();
}
}
public class Cat extends Animals {
public Cat(String name, int shoutNum) {
super(name, shoutNum);
// TODO Auto-generated constructor stub
}
public String shout() {
return "喵";
}
public String doShout() {
return super.doShout();
}
}
public class Monkey extends Animals {
public Monkey(String name, int shoutNum) {
super(name, shoutNum);
// TODO Auto-generated constructor stub
}
public String shout() {
return "吱";
}
public String doShout() {
return super.doShout();
}
}
public class Pig extends Animals {
public Pig(String name, int shoutNum) {
super(name, shoutNum);
// TODO Auto-generated constructor stub
}
public String shout() {
return "哼";
}
public String doShout() {
return super.doShout();
}
}
public class MachineCat extends Cat implements IChange {
public MachineCat(String name, int shoutNum) {
super(name, shoutNum);
// TODO Auto-generated constructor stub
}
@Override
public String change(String thing) {
return super.doShout() + " 我有万能的口袋,我可以变出"+thing;
}
}
public class SunWukong extends Monkey implements IChange {
public SunWukong(String name, int shoutNum) {
super(name, shoutNum);
// TODO Auto-generated constructor stub
}
@Override
public String change(String thing) {
return super.doShout() + " 我会七十二变,我可以变成"+thing;
}
}
public class ZhuBajie extends Pig implements IChange {
public ZhuBajie(String name, int shoutNum) {
super(name, shoutNum);
// TODO Auto-generated constructor stub
}
@Override
public String change(String thing) {
return super.doShout() + " 我会三十六变,我可以变成"+thing;
}
}
【UML图】